/**
 * @file      : main.c
 * @brief     : 程序入口源文件
 * @author    : huenrong (huenrong1028@gmail.com)
 * @date      : 2020-09-03 20:30:90
 *
 * @copyright : Copyright (c) 2020  胡恩荣
 *
 */

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include "./queue/queue.h"
#include "./miscellaneous/miscellaneous.h"
#define LOG_TAG "MAIN" // 这个需要定义到"elog.h"头文件包含之前
#include "./easy_logger/inc/elog.h"

/**
 * @brief  队列接收线程
 */
void *queue_pop_thread(void);

int main(int argc, char *argv[])
{
    int ret = -1;
    pthread_t rsu_thread_id;
    uint8_t push_data[256] = {0x11, 0x22, 0x33};
    uint8_t data_buf[1024] = {0}; // 转换成字符串的数据

    // easy_logger初始化
    /* close printf buffer */
    setbuf(stdout, NULL);
    /* initialize EasyLogger */
    elog_init();
    /* set EasyLogger log format */
    elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);
    elog_set_fmt(ELOG_LVL_ERROR, (ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME |
                                  ELOG_FMT_FUNC | ELOG_FMT_LINE));
    elog_set_fmt(ELOG_LVL_WARN, (ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME |
                                 ELOG_FMT_FUNC | ELOG_FMT_LINE));
    elog_set_fmt(ELOG_LVL_INFO, (ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME |
                                 ELOG_FMT_FUNC | ELOG_FMT_LINE));
    elog_set_fmt(ELOG_LVL_DEBUG, (ELOG_FMT_ALL & ~ELOG_FMT_FUNC));
    elog_set_fmt(ELOG_LVL_VERBOSE, (ELOG_FMT_ALL & ~ELOG_FMT_FUNC));
#ifdef ELOG_COLOR_ENABLE
    elog_set_text_color_enabled(true);
#endif
    /* start EasyLogger */
    elog_start();

    log_i("linux queue demo start...");

    // 队列初始化
    init_queue(&g_test_queue, 20);

    // 创建队列读取线程
    ret = pthread_create(&rsu_thread_id, NULL,
                         (void *)queue_pop_thread,
                         NULL);
    // 线程创建成功
    if (0 == ret)
    {
        // 线程分离, 结束时自动回收资源
        pthread_detach(rsu_thread_id);
    }

    // 队列插入
    while (1)
    {
        // log_i("start push...");
        ret = insert_queue(&g_test_queue, push_data, 3);
        if (ret > 0)
        {
            // 打印/记录日志
            // memset(data_buf, 0, sizeof(data_buf));
            // hex_to_str(data_buf, push_data, ret);
            // log_i("push data(len = %d): [%s]",
            //       ret, data_buf);
        }
        else
        {
            log_i("push_data fail");
        }

        usleep(10 * 1000);
    }

    return 0;
}

/**
 * @brief  队列接收线程
 */
void *queue_pop_thread(void)
{
    int ret = -1;
    uint8_t pop_data[256] = {0};
    uint8_t data_buf[1024] = {0}; // 转换成字符串的数据

    while (1)
    {
        log_i("start pop...");
        ret = get_queue(&g_test_queue, pop_data,
                        get_queue_length(g_test_queue));
        if (ret > 0)
        {
            // 打印/记录日志
            // memset(data_buf, 0, sizeof(data_buf));
            // hex_to_str(data_buf, pop_data, ret);
            // log_i("pop data(len = %d): [%s]",
            //       ret, data_buf);

            usleep(20 * 1000);
        }
        else
        {
            log_e("pop fail");
        }
    }
}
